import javax.swing.tree.TreeNode;

public class Main {
    public static void main1(String[] args) {
        System.out.println("Hello world!");
        //2.4 二叉树的存储
        //二叉树的存储结构分为：顺序存储和类似于链表的链式存储。
        //二叉树的链式存储是通过一个一个的节点引用起来的，常见的表示方式有二叉和三叉表示方式，具体如下：

        // 孩子表示法
        //class Node {
        //int val; // 数据域
        //Node left; // 左孩子的引用，常常代表左孩子为根的整棵左子树
        //Node right; // 右孩子的引用，常常代表右孩子为根的整棵右子树
        //} /
        /// 孩子双亲表示法
        //class Node {
        //int val; // 数据域
        //Node left; // 左孩子的引用，常常代表左孩子为根的整棵左子树
        //Node right; // 右孩子的引用，常常代表右孩子为根的整棵右子树
        //Node parent; // 当前节点的根节点
        //}


        //****2.5 二叉树的基本操作****
    }
    public static void main2(String[] args) {
        TestBiraryTree testBiraryTree = new TestBiraryTree();
        testBiraryTree.root = testBiraryTree.createTree();
        System.out.println("=======");
    }

    public static void main3(String[] args) {
        //****二叉树的遍历****
        //1. 前中后序遍历
        //学习二叉树结构，最简单的方式就是遍历。所谓遍历(Traversal)是指沿着某条搜索路线，依次对树中每个结
        //点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题(比如：打印节点内容、节点内容加
        //1)。 遍历是二叉树上最重要的操作之一，是二叉树上进行其它运算之基础

        // 前序遍历： 根左右
        // 根节点 -> 左子树 -> 右子树
        // 同理

        // 中序遍历: 左根右
        // 左子树 -> 根节点 -> 右子树
        // 遍历每棵子树的时候都要满足 左根右


        // 后续遍历： 左右根
        //  左子树 -> 右子树 -> 根节点
        // 同理

        //NLR：前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。
        //LNR：中序遍历(Inorder Traversal)——根的左子树--->根节点--->根的右子树。
        //LRN：后序遍历(Postorder Traversal)——根的左子树--->根的右子树--->根节点

        //// 前序遍历
        //void preOrder(Node root);
        //// 中序遍历
        //void inOrder(Node root);
        //// 后序遍历
        //void postOrder(Node root);


        //2.层序遍历   自上而下，自左至右逐层访问树的结点的过程
        //层序遍历：除了先序遍历、中序遍历、后序遍历外，还可以对二叉树进行层序遍历。设二叉树的根节点所在
        //层数为1，层序遍历就是从所在二叉树的根节点出发，首先访问第一层的树根节点，然后从左到右访问第2层
        //上的节点，接着是第三层的节点，以此类推，自上而下，自左至右逐层访问树的结点的过程就是层序遍历

        // 问题： 根据前序遍历 和 后序遍历 能不能创建一棵二叉树？
        // 不能， 因为无法确定 二叉树的左右子树

        // 后序遍历和中序遍历都是同一个结果 说明 每棵子树都没有右节点
        // 是一棵只有左子树的二叉树
        TestBiraryTree testBiraryTree = new TestBiraryTree();
        TestBiraryTree.TreeNode root = testBiraryTree.createTree();
        testBiraryTree.perOrder(root);
        System.out.println();
        testBiraryTree.inOrder(root);
        System.out.println();
        testBiraryTree.postOrder(root);
        System.out.println();
    }

     public static void main(String[] args) {
        System.out.println("Hello world!");

        // 二叉树的基本的操作
        TestBinaryTree testBinaryTree = new TestBinaryTree();
        TestBinaryTree.TreeNode root = testBinaryTree.createTree();
        System.out.println("节点的个数1: "+testBinaryTree.size(root));
        testBinaryTree.size2(root);
        System.out.println("节点的个数2: "+TestBinaryTree.nodeSize); // 但是尽量不要加static
        System.out.println("叶子节点的个数: "+testBinaryTree.getLeafNodeCount(root));
        testBinaryTree.getLeafNodeCount1(root);
        System.out.println("叶子节点的个数2: "+testBinaryTree.leafSize);

        System.out.println("第k层的节点个数 "+testBinaryTree.getKLeveNodeCount(root,3));

        System.out.println("二叉树的高度为："+testBinaryTree.getHeight(root));


       TestBinaryTree.TreeNode ret =  testBinaryTree.find(root, 'E');
        System.out.println("查找："+ret.val);

        System.out.println("层序遍历");
        testBinaryTree.levelOrder(root);
        System.out.println();
    }
}